﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace JSIPDemo2
{
    public class CommValue
    {
        #region JSIP库执行接口的状态码定义
        /////////////////////////////////////////////////////////////////
        //JSIP库执行接口的状态码定义
        public const int JSIP_OK = 0x01;  //成功，JSIP库接口函数执行成功
        public const int JSIP_SOCKREUSE_ERR = 0xC9; //失败，设置socket的SO_REUSEADDR属性失败
        public const int JSIP_SOCKBINDTODEV_ERR = 0xCA;//失败，套接字绑定到网络设备执行失败
        public const int JSIP_ALLOC_ERR = 0xCB;  //失败，申请内存失败
        public const int JSIP_SENDCRYPTMODE_ERR = 0xCC;  //失败，发送时加密模式填写错误
        public const int JSIP_SENDRANDKEY_NULL = 0xCD;  //失败，发送时对数据进行随机数加密，随机数密钥为空，或者密钥协商未完成
        public const int JSIP_SENDDESKEY_NULL = 0xCE;  //失败，发送时对数据进行DES加密，DES密钥为空，或者密钥协商未完成
        public const int JSIP_SSOCKLISTEN_ERR = 0xCF;//失败，套接字侦听执行失败
        public const int JSIP_SSOCKBUFF_ERR = 0xD0;//失败，套接字设置缓冲区属性执行失败
        public const int JSIP_SSOCKTIMEOUT_ERR = 0xD1;//失败，套接字设置超时属性执行失败
        public const int JSIP_SSOCKBROADCAST_ERR = 0xD2;    //失败，套接字设置广播属性执行失败
        public const int JSIP_SSOCKBIND_ERR = 0xD3; //失败，套接字绑定端口执行失败
        public const int JSIP_SSOCKCONNECT_ERR = 0xD4;  //失败，套接字连接函数执行失败
        public const int JSIP_SSOCKFIBO_ERR = 0xD5;//失败，设置套接字为非阻塞执行失败
        public const int JSIP_CREATESOCK_ERR = 0xD6;    //失败，创建套接字函数执行失败
        public const int JSIP_RECVCALLBACK_NULL = 0xD7; //失败，接收回调函数未定义
        public const int JSIP_CONTEXTFULL_ERR = 0xD8;//失败，上下文链接已满
        public const int JSIP_SEND_NOCONCONTEXT = 0xD9; //失败，执行send函数时，没有找到连接的上下文
        public const int JSIP_SEND_IPPORTNULL = 0xDA;   //失败，执行send函数时，ip或者端口不正确
        public const int JSIP_FUNCTIONKEY_ERR = 0xDB;//失败，发送函数返回，不能发送密钥相关功能
        public const int JSIP_FUNCTIONNUM_ERR = 0xDC;   //失败，发送函数返回，功能号不正确
        public const int JSIP_SIGNDATACONTET_ERR = 0xDD;    //失败，下位机密钥认证获取签名数据内容包含有不是16进制编码的字符
        public const int JSIP_SIGNATUREDATAL_ERR = 0xDE;    //失败，下位机密钥认证获取签名数据长度失败
        public const int JSIP_SOCKOPTUNBLOCK_ERR = 0xDF;    //失败，设置socket的非阻塞属性失败 
        public const int JSIP_SOCKRECVBUFF_ERR = 0xE0;  //失败，设置socket的接收缓冲区大小失败
        public const int JSIP_SOCKETNOTWRITE_ERR = 0xE1;    //失败，建立的socket不可写
        public const int JSIP_RECVTHREAD_ERR = 0xE2;    //失败，启动接收数据线程失败 
        public const int JSIP_LISTENTHREAD_ERR = 0xE3;  //失败，启动侦听连接线程失败
        public const int JSIP_KCONTACTTHREAD_ERR = 0xE4;//失败，启动密钥协商线程失败
        public const int JSIP_ERR_MACHINE_INFO = 0xE6;  //失败，回调给的下位机相关信息不正确
        public const int JSIP_ERR_RANDDIFF_ERR = 0xE7;  //失败，回调给的CPUID长度不对
        public const int JSIP_ERR_NO_JSST_FILE = 0xE8;  //失败，回调给的JSST文件不存在（未找到）
        public const int JSIP_ERR_JSST_FORMAT = 0xE9;   //失败，回调给的JSST文件格式不对
        public const int JSIP_ERR_JSST_LENGTH = 0xEA;   //失败，回调给的JSST文件长度不对
        public const int JSIP_ERR_JSSTFAIL_3 = 0xEB;    //失败，连续3次以上无法上下位机认证
        public const int JSIP_CPUID_UNREGISTER = 0xEC;  //失败，尚未注册读CPUID的回调函数
        public const int JSIP_JSST_UNRIGISTER = 0xED;   //失败，尚未注册读JSST文件的回调函数
        public const int JSIP_EE_NODATA = 0xEE; //失败，未收到数据
        public const int JSIP_CRC_ERR = 0xEF;   //失败，CRC错误
        public const int JSIP_NO_DESKEY = 0xF0; //失败，尚未约定好DES密钥
        public const int JSIP_NO_RNDKEY = 0xF1; //失败，尚未约定好随机密钥
        public const int JSIP_PARA_ERR = 0xF2;  //失败，密钥参数输入错误
        public const int JSIP_SEND_FAIL = 0xF3; //失败，执行send函数失败
        public const int JSIP_SEND_NOCONTEXT = 0xF4;    //失败，执行send函数没有找到链接对应的上下文	
        public const int JSIP_SEND_SOCKETIDNULL = 0xF5; //失败，执行send函数时，socketId为空
        public const int JSIP_NO_SOCKET = 0xF6; //失败，没有所要求的socket连接
        public const int JSIP_SAME_TCP_SERVER = 0xF7;   //失败，已经建立了一个相同地址的TCP服务器端
        public const int JSIP_SAME_TCP_CLIENT = 0xF8;//失败，已经建立了一个相同地址的TCP客户端
        public const int JSIP_HAD_UDP_SERVER = 0xF9;    //失败，已经建立了一个UDP服务器端
        public const int JSIP_HAD_UDP_CLIENT = 0xFA;    //失败，已经建立了一个UDP客户端
        public const int JSIP_JSIPCONTEXT_ERR = 0xFB;   //失败，以太网通讯的JSIPContext头指针构建失败
        public const int JSIP_WSASTART_ERR = 0xFC;  //失败，调用WSAStartUp失败
        public const int JSIP_HAD_INITED = 0xFD;    //失败，JSIP已经初始化过
        public const int JSIP_NO_INIT = 0xFE;//失败，JSIP还未初始化
        public const int JSIP_FUNC_FAILUER = 0xFF;  //失败，JSIP库中的函数执行失败
                                                    /////////////////////////////////////////////////////////////////////// 
        #endregion
    }

        public enum JSIP_BOOL
        {
            JSIP_FALSE = 0,
            JSIP_TRUE = 1
        }
      
        public struct RandomKey //随机数密钥结构体
        {
            byte mKmState;//随机数密钥约定进程状态:0-初始化态,1－约定1完成,2－约定完毕
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            byte[] Ka;//随机数内部密钥：上位机Ka,下位机Kb
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            byte[] Km;//随机数通信密钥：上位机Km,下位机Km
        }
        // RK;
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct DesKey       //DES通信密钥结构体
        {
            byte mDesKeyState;     //DES密钥约定进程状态:0-初始化态,1－已约定1,2－约定完毕   
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            byte[] desKey;       //DES通信密钥
        }
        // DK;
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct JSIP_HEAD_Para   //报文报头主要参数,对外的参数头
        {
            ushort crypt_mode;      //加密方式
            byte protocol_type;    //协议类型码
            byte func_code;        //功能分类码
            ushort cmd;             //命令字
            ushort status;          //命令字状态
            byte producttype;      //子系统产品类型
            uint unit_id;           //设备机号
            uint session_id;        //会话ID
        } //DGRAM_HEAD;//别名 c++中的别名用法在c#中没有 智能使用using替换  但范围有限只能在某一个类中使用

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct jsSignature_Jsst_Data    //Jsst签名参数结构体
        {
            uint deviceID;      //越级认证时需要填写的deviceID
            short ID;                   //0x00B4
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 180 + 1)]
            char[] rsaPublicKey;     //RSA公模内容(Base64格式)
            char hashResult;            //0x14（Hash的结果长度）
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40 + 1)]
            char[] hashContent;       //Hash的结果内容
            char filenamelength;        //0x0A（设备签名文件名的长度）
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10 + 1)]
            char[] filename;      //设备签名文件名：后缀(.jsst)
        }
        // SIGNATUREDATA;
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct jsSignature_Jsst_Result //Jsst签名认证的结果
        {
            uint deviceID;      //越级认证时需要的设备ID，由G3中心通过盒子认证下面的控制机设备时使用
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
            char[] hashContent;       //上位机计算出的hash结果内容
        }
        // SIGNATURERESULT;
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct jsIP_DGram_ComHead  //JSIP内部用的发送数据时的包头结构体定义
        {
            uint version;              //协议版本号，固定为0xaa 55 5a a5
            byte producttype;        //子系统产品类型，H,C车场，G3软件等等
            byte sdkversion;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
            byte[] reserved;            //保留，缺省为0x00 00
            ushort crypt_mode;            //通信加密方式
            ushort status;                //则发送命令时填写状态字=0，回应时若命令执行出错，则填充具体的状态字
            ushort session_id;           //会话id
            uint unit_id;             //设备机号
            byte protocol_type;        //协议类型码
            byte func_code;              //功能分类码
            ushort obj_id;                //操作对象（命令字）
            uint obj_len;              //数据对象长度
            ushort check_sum;            //头部校验和
        }
        //DGRAMCOMHEAD;
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct socket_ID_info
        {
            int ID; //socket ID
            JSIP_BOOL m_bTcp;
            JSIP_BOOL m_bClient;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
            char[] Ip;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            char[] Port;
            int uTimeSpan; //时间间隔，对于TCP客户端标识已经多久没有进行过通讯了，对于TCP服务端则表示当前还剩多久时间则超时
            byte producttype;//子系统产品类型，H,C车场，G3软件等等
            byte sdkversion; //JSIPSDK库的版本
        }
        // SOCKET_ID_INFO;
       
        //UDP广播接收时的回调函数
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct udp_recv_cb_Param
        {
            ushort socketId;    //接收socketId
            ushort serverSockId;//对于通过服务端侦听后新建的socket连接，收到数据时要带出启动服务端时分配的socketID方便区分数据来源。
            JSIP_HEAD_Para head;    //接收到的报文头
            uint len;   //接收到的数据长度
            byte[] data; //接收到的数据
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
            char[] Ip;         //接收到的数据来自哪个IP
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            char[] Port;       //接收到的数据来自哪个端口
        }
        //UDP_RECV_CB_PARAM;
  
}
